package com.hrm.houfei.biz.impl;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Restrictions;

import com.hrm.houfei.biz.IMoneyStandardBiz;
import com.hrm.houfei.biz.IPersonFileBiz;
import com.hrm.houfei.po.Moneyinfo;
import com.hrm.houfei.po.Personfile;
import com.hrm.houfei.po.Userinfo;
import com.hrm.houfei.utils.CreatRandom;
import com.hrm.houfei.utils.MyDate;
import com.hrm.houfei.dao.IPersonFileDAO;

public class PersonFileBizImpl implements IPersonFileBiz {
	// 删除操作
	public static int DELETE = 1;
	// 恢复操作
	public static int RESUME = 2;

	// 人员档案信息dao接口
	IPersonFileDAO ipfdao = null;
	// 薪酬标准业务
	IMoneyStandardBiz imsb = null;

	public void setImsb(IMoneyStandardBiz imsb) {
		this.imsb = imsb;
	}

	public void setIpfdao(IPersonFileDAO ipfdao) {
		this.ipfdao = ipfdao;
	}

	/**
	 * 登记人员档案信息
	 * 
	 * @param personFile
	 *            人员信息实体
	 * @param user
	 *            当前登陆用户
	 * @return 人员信息实体
	 */
	public boolean savePersonFile(Personfile personFile, Userinfo user) {
		try {
			// 产生一个随机的人员档案编号
			String mypfid = CreatRandom.createRandomPersonFileId();
			// 给人员档案编号设置数值
			personFile.setPfFileId(mypfid);
			// 设置登记人
			personFile.setUserAddName(user.getUserTrueName());
			// 设置登记日期
			personFile.setPfAddDate(MyDate.getNowDate("yyyy-MM-dd HH:mm:ss"));
			// 获取薪酬标准号
			String standardId = personFile.getMiMoneyStandardId();
			// 获取薪酬标准单信息实体
			Moneyinfo moneyinfo = this.imsb
					.getMoneyInfoByStandardId(standardId);
			// 设置薪酬
			personFile.setMoneyinfo(moneyinfo);
			// 设置状态
			personFile.setPfState("未审核");
			// 调用dao
			this.ipfdao.save(personFile);
			return true;
		} catch (Exception e) {
			System.out.println(e.getMessage());
			return false;
		}
	}

	/**
	 * 审核人员档案信息
	 * 
	 * @param personFile
	 * @param pkid
	 * @param userInfo
	 * @return
	 */
	public boolean updateCheckPersonFile(Personfile personFile, String pkid,
			Userinfo userInfo) {
		try {
			// 根据主键id获取人员档案实体
			Personfile pf = this.ipfdao.findById(Integer.parseInt(pkid));
			personFile.setPfId(pf.getPfId());
			personFile.setUserCheckName(userInfo.getUserTrueName());
			personFile.setPfCheckDate(MyDate.getNowDate("yyyy-MM-dd HH:mm:ss"));
			personFile.setUserAddName(pf.getUserAddName());
			personFile.setPfAddDate(pf.getPfAddDate());

			personFile.setPfCompany(pf.getPfCompany());
			personFile.setPfBranch(pf.getPfBranch());
			personFile.setPfJob(pf.getPfJob());
			personFile.setPfFileId(pf.getPfFileId());

			String miStandardId = pf.getMiMoneyStandardId();
			// 获取薪酬标准单信息实体
			Moneyinfo moneyinfo = this.imsb
					.getMoneyInfoByStandardId(miStandardId);
			personFile.setMoneyinfo(moneyinfo);
			personFile.setPfState("通过审核");
			this.ipfdao.update(personFile);
			return true;
		} catch (Exception e) {
			return false;
		}
	}

	/**
	 * 变更人员档案信息
	 * 
	 * @param personFile
	 * @param pkid
	 * @param userInfo
	 * @return
	 */
	public boolean updatePersonFile(Personfile personFile, String pkid,
			Userinfo userInfo) {
		try {
			// 根据主键id获取人员档案实体
			Personfile pf = this.ipfdao.findById(Integer.parseInt(pkid));
			personFile.setPfId(pf.getPfId());
			personFile.setPfCheckDate(pf.getPfCheckDate());
			personFile.setUserCheckName(pf.getUserCheckName());
			personFile.setUserAddName(pf.getUserAddName());
			personFile.setPfAddDate(pf.getPfAddDate());
			personFile.setPfCompany(pf.getPfCompany());
			personFile.setPfBranch(pf.getPfBranch());
			personFile.setPfJob(pf.getPfJob());
			personFile.setPfFileId(pf.getPfFileId());

			String miStandardId = pf.getMiMoneyStandardId();
			// 获取薪酬标准单信息实体
			Moneyinfo moneyinfo = this.imsb
					.getMoneyInfoByStandardId(miStandardId);
			personFile.setMoneyinfo(moneyinfo);
			personFile.setPfState(pf.getPfState());
			this.ipfdao.update(personFile);
			return true;
		} catch (Exception e) {
			return false;
		}
	}

	/**
	 * 多条件分页模糊查询人员档案信息
	 * 
	 * @param name
	 *            姓名
	 * @param addDate
	 *            添加日期
	 * @param start
	 *            索引
	 * @param limit
	 *            页大小
	 * @return 当前页的所有数据
	 */
	public List<Personfile> findPersonInfoByPage(String name, String addDate,
			String start, String limit) {
		// 离线查询
		DetachedCriteria criteria = DetachedCriteria.forClass(Personfile.class);
		// 如果条件姓名不为空,那么将条件姓名附加上
		if (!"".equals(name) && null != name) {
			criteria.add(Restrictions.like("pfName", name, MatchMode.ANYWHERE));
		}
		// 如果条件登记时间不为空,那么将条件姓名附加上
		if (!"".equals(addDate) && null != addDate) {
			criteria.add(Restrictions.like("pfAddDate", addDate,
					MatchMode.ANYWHERE));

		}

		// 为分页参数设置默认值
		if ("".equals(start) || null == start) {
			start = "0";
		}
		if ("".equals(limit) || null == limit) {
			limit = "10";
		}

		// 调用dao获取查询后的数据
		List<Personfile> list = this.ipfdao.findPersonFileByPage(criteria,
				Integer.parseInt(start), Integer.parseInt(limit));

		return list;
	}

	/**
	 * 多条件模糊查询人员档案信息总记录条数
	 * 
	 * @param name
	 *            姓名
	 * @param addDate
	 *            添加日期
	 * @return 给定条件的总记录条数
	 */
	public int getPersonInfoListSize(String name, String addDate) {
		// 离线查询
		DetachedCriteria criteria = DetachedCriteria.forClass(Personfile.class);
		// 如果条件姓名不为空,那么将条件姓名附加上
		if (!"".equals(name) && null != name) {
			criteria.add(Restrictions.like("pfName", name, MatchMode.ANYWHERE));
		}
		// 如果条件登记时间不为空,那么将条件姓名附加上
		if (!"".equals(addDate) && null != addDate) {
			criteria.add(Restrictions.like("pfAddDate", addDate,
					MatchMode.ANYWHERE));
		}
		// 调用dao获取查询后的数据
		int result = this.ipfdao.getPersonFileListSize(criteria);
		return result;
	}

	/**
	 * 删除与恢复人员档案信息
	 * 
	 * @param pkid
	 *            主键id
	 * @param option
	 *            操作 1为删除,2为恢复
	 * @return
	 */
	public boolean deleteOrResumePersonInfoByPkid(String pkid, int option) {
		try {
			// 获取主键id
			int id = Integer.parseInt(pkid);
			// 获取人员档案心想你实体
			Personfile personfile = this.ipfdao.findById(id);
			if (option == 1) {
				personfile.setPfDeleteState("已删除");
			} else {
				personfile.setPfDeleteState("正常");
			}
			// 执行(删除),修改其删除状态即可
			this.ipfdao.update(personfile);
			return true;
		} catch (Exception e) {
			return false;
		}

	}

	/**
	 * 根据姓名和身份证号查询人员档案信息
	 * 
	 * @param pfName
	 *            姓名
	 * @param pfIdCard
	 *            身份证号
	 * @return PersonFile实体
	 */
	public Personfile showPersonFileByCondition(String pfName, String pfIdCard) {
		// 离线查询
		DetachedCriteria criteria = DetachedCriteria.forClass(Personfile.class);
		// 附加条件
		if (null != pfName && !"".equals(pfName)) {
			criteria.add(Restrictions.eq("pfName", pfName));
		}
		criteria.add(Restrictions.eq("pfIdCard", pfIdCard));
		// 执行查询
		List<Personfile> list = this.ipfdao.findPersonFileByCondition(criteria);
		// 获取实体
		Personfile pf = null;
		if (list.size() == 1) {
			pf = list.get(0);
		}
		return pf;
	}
	
	/**
	 * 统计人员分布情况
	 * @return
	 */
	public List<Personfile> countReportPersonfile(){
		return this.ipfdao.findAll();
	}

}
